package rodrigosetti.colorstrike.fase;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.Sprite;
import rodrigosetti.midpgame.GameCore;

/**
 * Define um elemento que existe em uma fase do jogo.
 */
public abstract class Elemento {

	protected Fase fase;

	/**
	 * Tipos de colisao
	 */
	public static final int SEM_COLISAO = 0;
	public static final int LATERAL_ESQ = 1;
	public static final int LATERAL_DIR = 2;
	public static final int SUPERIOR = 3;
	public static final int INFERIOR = 4;
	public static final int INTERNA = 5;
	
	protected Sprite sprite;
	public boolean ativo;

	public Elemento(Fase fase) {
		this.fase = fase;
		ativo = true;
	}

	public int getX()
	{
		return sprite.getX();
	}
	public int getY()
	{
		return sprite.getY();
	}
	
	public int getWidth()
	{
		return sprite.getWidth();
	}
	public int getHeight()
	{
		return sprite.getHeight();
	}
	
	public void desenhar(Graphics g)
	{
		sprite.setPosition(sprite.getX() - (int)fase.foco.x + GameCore.centerX,
				sprite.getY() - (int)fase.foco.y + GameCore.centerY);
		sprite.paint(g);
		sprite.setPosition(sprite.getX() + (int)fase.foco.x - GameCore.centerX,
				sprite.getY() + (int)fase.foco.y - GameCore.centerY);
	}
	
	/**
	 * Retorna tipo de colisao, se ha, com outro elemento
	 * 
	 * @param e
	 * @return
	 */
	public int colide(Elemento e) {
		
		if (e instanceof Informacao)
			return SEM_COLISAO;
		
		/* Testa colisao com outro elemento */
		if (this.sprite.collidesWith(e.sprite, false)) {
			/* Colisao ocorreu */
			
			/* Verifica se ha rebate vertical para cima */
			if (this.getY() < e.getY()) {
				return SUPERIOR;
			}
			/* Verifica se ha rebate horizontal para esquerda */
			else if (this.getX() < e.getX()) {
				return LATERAL_ESQ;
			}
			/* Verifica se ha rebate horizontal para direita */
			else if (this.getX() + this.getWidth() > e.getX() + e.getWidth()) {
				return LATERAL_DIR;
			}
			/* Verifica se ha rebate vertical para baixo */
			else if (this.getY() + this.getHeight() > e.getY() + e.getHeight()) {
				return INFERIOR;
			}

			return INTERNA;
		}

		return SEM_COLISAO;
	}		

}
